package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jt.mapper.ItemDescMapper;
import com.jt.pojo.ItemDesc;
import com.jt.vo.EasyUITable;
import com.jt.pojo.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jt.mapper.ItemMapper;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Service
public class ItemServiceImpl implements ItemService {
	
	@Autowired
	private ItemMapper itemMapper;
	@Autowired
	private ItemDescMapper itemDescMapper;

	/**
	 * 执行步骤:1.手动编辑sql    2.利用MP机制 动态生成
	 * SELECT * FROM tb_item LIMIT 起始位置,查询记录数
	 /*第一页 java中数组运算 一般都是含头不含尾
	 SELECT * FROM tb_item LIMIT 0,20;
	 /*第二页
	 SELECT * FROM tb_item LIMIT 20,20;
	 /*第三页
	 SELECT * FROM tb_item LIMIT 40,20;
	 *第N页
	 SELECT * FROM tb_item LIMIT (n-1)ROWS,ROWS;
	 */
//	@Override
//	public EasyUITable findItemByPage(Integer page, Integer rows) {
//		//参数1.记录总数   参数2: rows 当前页的记录数
//		long total = itemMapper.selectCount(null);
//		Integer startIndex = (page-1)*rows;
//		List<Item> itemList = itemMapper.findItemByPage(startIndex,rows);
//		return new EasyUITable(total,itemList);
//	}
	//利用MP方式进行分页查询
	//Page参数问题:  参数1: 第几页    参数2:size 每页多少天
	@Override
	public EasyUITable findItemByPage(Integer page, Integer rows) {
		QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
		queryWrapper.orderByDesc("updated");
		IPage<Item> iPage = new Page<>(page,rows);
		//根据分页模型执行分页操作,并将结果返回给分页对象.
		iPage = itemMapper.selectPage(iPage, queryWrapper);
		long total = iPage.getTotal();
		List<Item> itemList = iPage.getRecords();
		return new EasyUITable(total,itemList);
	}

	//<insert id="xxx" useGennratedKeys="true" keyProperty="id" column="id"></insert>
	@Transactional
	@Override
	public void saveItem(Item item, ItemDesc itemDesc) {
//		item.setStatus(1).setCreated(new Date()).setUpdated(item.getCreated());
		item.setStatus(1);
		itemMapper.insert(item);
		//分析问题：item表的主键是自增 数据库入库之后才会有主键生成
		//解决方案：让数据库完成入库之后自动的实现主键的回显 该操作由MP方式动态完成
		itemDesc.setItemId(item.getId());//必然有值
		itemDescMapper.insert(itemDesc);
	}

	@Transactional
	@Override
	public void updateItem(Item item,ItemDesc itemDesc) {
//		item.setUpdated(new Date());
		//根据对象中不为null的元素充当set条件，主键充当where条件
		itemMapper.updateById(item);
		//实现商品详情更新
		itemDesc.setItemId(item.getId());//设定主键
//		itemDesc.setUpdated(new Date());
		itemDescMapper.updateById(itemDesc);
	}

	@Transactional
	@Override
	public void deleteItems(Long[] ids) {
		List<Long> idsList = Arrays.asList(ids);
		itemMapper.deleteBatchIds(idsList);
		itemDescMapper.deleteBatchIds(idsList);
//		itemMapper.deleteItemsByIds(ids);
	}

	@Override
	public void updateItemStatus(Long[] ids, Integer status) {

		//1.利用MP方式执行数据库操作
		Item item = new Item();
		item.setStatus(status);
		//定义修改操作的条件构造器  where id in ();
		UpdateWrapper<Item> updateWrapper = new UpdateWrapper<>();
		List<Long> idList = Arrays.asList(ids); //数据转化为集合
		updateWrapper.in("id",idList);
		//根据mp机制.实现批量的数据更新操作
		itemMapper.update(item,updateWrapper);

//		itemMapper.updateItemStatus(ids,status);
	}

	@Override
	public ItemDesc findItemDescById(Long itemId) {

		return itemDescMapper.selectById(itemId);
	}
}
